#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <string.h>
#include <fcntl.h>
#include  <ctype.h>

#define MAX_CMD 1024
char command[MAX_CMD];
int myshell_face()
{
    memset(command, 0x00, MAX_CMD);
    printf("[Tomshell$]#");
    fflush(stdout);//清理缓冲区
    if (scanf("%[^\n]%*c", command) == 0)
    {
        getchar();
        return -1;
    }
    return 0;
}
char **do_parse(char *command)
{
    int argc = 0;
    static char *argv[32];
    char *ptr = command;
    while (*ptr != '\0')
    {
        if (!isspace(*ptr))//如果不是空格就一直读取命令，直到遇到空格
        {
            argv[argc++] = ptr;
            while ((!isspace(*ptr)) && (*ptr) != '\0')//#include  <ctype.h>   isspace检测是否遇到空格
            {
                ptr++;              //如果不是空格就一直读取命令，直到遇到空格
            }
        }
        else
        {
            while (isspace(*ptr))//如果命令前几个是空格就消除空格
            {
                *ptr = '\0';//这句必须加了
                ptr++;
            }
        }
    }
    argv[argc] = NULL;
    return argv;
}
int do_exec(char *command)//进程替换函数=》用的就是exec
{
    char **argv = {NULL};
    int pid = fork(); // 一切形式的进程都让子进程去办，子进程就是白手套。
    if (pid == 0)
    {
        argv = do_parse(command);
        if (argv[0] == NULL)
        {
            exit(-1);
        }
        execvp(argv[0], argv); // 进程替换函数，可以添加环境变量p（path），参数格式是数组v（vector）
    }                          // 可以把exec当作call（goto）函数，exit当作return函数。
    else
    {
        waitpid(pid, NULL, 0);
    }
    return 0;
}
int main(int argc, char *argv[])
{
    while (1) // shell主循环
    {
        if (myshell_face() < 0)
            continue;
        do_exec(command);
    }
    return 0;
}
